package com.leetCode.ArrayDemo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class InsertArrayDemo {
    public static void main(String[] args) {
        int[][] param = new int[2][2];
        param[0] = new int[]{1,3};
        param[1] = new int[]{6,9};
        System.out.println(insert(param,new int[]{2,5}));
    }

    /**
     * 给你一个 无重叠的 ，按照区间起始端点排序的区间列表 intervals，其中 intervals[i] = [starti, endi] 表示第 i 个区间的开始和结束，
     * 并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval = [start, end] 表示另一个区间的开始和结束。
     *
     * 在 intervals 中插入区间 newInterval，使得 intervals 依然按照 starti 升序排列，且区间之间不重叠（如果有必要的话，可以合并区间）。
     *
     * 返回插入之后的 intervals。
     *
     * 注意 你不需要原地修改 intervals。你可以创建一个新数组然后返回它。
     *
     * 示例 1：
     *
     * 输入：intervals = [[1,3],[6,9]], newInterval = [2,5]
     * 输出：[[1,5],[6,9]]
     * 示例 2：
     *
     * 输入：intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]
     * 输出：[[1,2],[3,10],[12,16]]
     * 解释：这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。
     * 提示：
     *
     * 0 <= intervals.length <= 104
     * intervals[i].length == 2
     * 0 <= starti <= endi <= 105
     * intervals 根据 starti 按 升序 排列
     * newInterval.length == 2
     * 0 <= start <= end <= 105
     * Related Topics
     * 数组
     */
    public static int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> newList = new ArrayList<>(Arrays.asList(intervals));
        newList.add(newInterval);
        int[][] newArr = newList.toArray(new int[newList.size()][]);
        Arrays.sort(newArr, (a, b) -> {
            return Integer.compare(a[0], b[0]);
        });
        List<int[]> resArr = new ArrayList<>();
        for (int i = 0;i < newArr.length;i++){
            int L = newArr[i][0],R = newArr[i][1];
            if (resArr.size() == 0 || resArr.get(resArr.size() - 1)[1] < L){
                resArr.add(new int[]{L,R});
            } else {
                resArr.get(resArr.size() - 1)[1] = Math.max(resArr.get(resArr.size() - 1)[1],R);
            }
        }
        return resArr.toArray(new int[resArr.size()][]);
    }

    public static int[][] insert1(int[][] intervals, int[] newInterval) {
        List<int[]> newList = new ArrayList<>();
        boolean placed = false;
        int left = newInterval[0],right = newInterval[1];
        for (int i = 0; i < intervals.length; i++) {
            if (intervals[i][0] > right){
                //再插入区间的右侧且无交集
                if (!placed){
                    newList.add(new int[]{left,right});
                    placed = true;
                }
                newList.add(intervals[i]);
            } else if (intervals[i][1] < left){
                //再插入区间的左侧且无交集
                newList.add(intervals[i]);
            } else {
                left = Math.min(left,intervals[i][0]);
                right = Math.max(right,intervals[i][1]);
            }
        }
        if (!placed){
            newList.add(new int[]{left,right});
        }
        return newList.toArray(new int[newList.size()][]);
    }

    public static int[][] insert2(int[][] intervals, int[] newInterval) {
        int left = newInterval[0];
        int right = newInterval[1];
        boolean placed = false;
        List<int[]> ansList = new ArrayList<int[]>();
        for (int[] interval : intervals) {
            if (interval[0] > right) {
                // 在插入区间的右侧且无交集
                if (!placed) {
                    ansList.add(new int[]{left, right});
                    placed = true;
                }
                ansList.add(interval);
            } else if (interval[1] < left) {
                // 在插入区间的左侧且无交集
                ansList.add(interval);
            } else {
                // 与插入区间有交集，计算它们的并集
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        if (!placed) {
            ansList.add(new int[]{left, right});
        }
        return ansList.toArray(new int[ansList.size()][]);
    }
}
